package entity;

import java.util.Date;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import entity.Iteracao.SituacaoIteracao;
import exception.AlmiranteException;

@Entity
@Table(name="execucao", schema="almirante")
public class Execucao {
	@Id
	@SequenceGenerator(name="execucao_seq", sequenceName="execucao_id_execucao_seq", schema="almirante")
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="execucao_seq")
	@Column(name="id_execucao")
	private Long id;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="data_criacao")
	private Date dataCriacao;
	
	@Embedded
	@AttributeOverrides({
		@AttributeOverride(name="inicio", column=@Column(name="inicio_estimado", nullable=false)),
		@AttributeOverride(name="fim", column=@Column(name="fim_estimado", nullable=false))
	})
	private Periodo periodo;
	
	@Column(name="qtd_horas")
	private Integer qtdHoras;
	
	@Column(name="descricao", length=1000)
	private String descricao;
	
	@ManyToOne
	@JoinColumn(name="id_atividade", referencedColumnName="id_atividade")
	private Atividade atividade;
	
	@ManyToOne
	@JoinColumn(name="id_recurso", referencedColumnName="id_recurso")
	private Recurso responsavel;
	
	Execucao() {}
	
	Execucao(Periodo periodo, Integer qtdHoras, String descricao, Atividade atividade) {
		this.dataCriacao= new Date();
		this.periodo = periodo;
		this.qtdHoras = qtdHoras;
		this.descricao = descricao;
		this.atividade = atividade;
		this.responsavel = atividade.getResponsavel();
	}
	
	public Date getInicio() {
		return periodo.getInicio();
	}
	
	public Date getFim() {
		return periodo.getFim();
	}
	
	public void setPeriodo(Periodo periodo) {
		validaIteracaoEmAndamento();
		this.periodo = periodo;
	}
	
	public Integer getQtdHoras() {
		return qtdHoras;
	}
	
	public void setQtdHoras(Integer qtdHoras) {
		validaIteracaoEmAndamento();
		this.qtdHoras = qtdHoras;
	}

	public String getDescricao() {
		return descricao;
	}
	
	public void setDescricao(String descricao) {
		validaIteracaoEmAndamento();
		this.descricao = descricao;
	}
	
	public Recurso getResponsavel() {
		return responsavel;
	}
	
	private void validaIteracaoEmAndamento() {
		if (!atividade.getIteracao().getSituacao().equals(SituacaoIteracao.EM_ANDAMENTO))
			throw new AlmiranteException("Execução não pode ser alterada, pois a iteração não está Em Andamento.");
	}
	
	public Long getId() {
		return id;
	}

	public Date getDataCriacao() {
		return dataCriacao;
	}

	public Atividade getAtividade() {
		return atividade;
	}
}
